//
//  LyUserAccount.swift
//  LySwift微博
//
//  Created by 贠明东 on 15/11/28.
//  Copyright © 2015年 itcCZ. All rights reserved.
//

import UIKit
//将对象归档到沙盒里面
class LyUserAccount: NSObject,NSCoding {
    
    ///用于调用哪个accesstoken，接口获取授权后的accesstoken。
    var access_token:  String?
    
//    access_token的生命周期，单位是秒数。在KVC字典转模型基本数据类型需要设置初始值。
    var expires_in: NSTimeInterval = 0 {
        didSet {
            //设置过期时间
            expiresDate = NSDate(timeIntervalSinceNow: expires_in)
        }
    }
    
    ///保存过期时间NSDate
    var expiresDate: NSDate?

    //当前授权用户的UID
    var uid: String?
   
    ///字典转模型
//    init(dict: [String: AnyObject]) {
//        access_token = dict["access_token"] as! String
//        expires_in = dict["expires_in"] as! String
//        uid = dict["uid"] as! String
//        super.init()
//    }
    
    //字典转模型
     init(dict: [String: AnyObject]) {
        super.init()
        //KVC 字典转模型
        setValuesForKeysWithDictionary(dict)
     }
    
    //保存路径 static 类方法也可以访问，对象方法访问需要使用类名。属性名
   static let plistPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! + "/account.plist"
    
    /// 保存账户信息到沙盒
    func saveAccout() {
      
        
        // 归档当前类
        NSKeyedArchiver.archiveRootObject(self, toFile: LyUserAccount.plistPath)
    }
    /*
        项目经常需要使用到LyUserAccount,如果每次调用loadUserAccount,都会去沙盒解档一个账户.这样是比较消耗性能.
        当没有账户,去沙盒解档一个.如果解档账户成功,将它保存在内存中,以后直接访问内存中的账户.可以提高性能
    */
    
    /// 声明属性记住内存中的账户
   private static var userAccount: LyUserAccount?
    
    /// 读取 保存在沙盒里面的账户信息
    class func loadUserAccount() ->LyUserAccount? {
//        //解档,如果有对象需要判断是否过期
//        if let account = NSKeyedUnarchiver.unarchiveObjectWithFile(plistPath) as? LyUserAccount{
//            //能来到这里说明解档了一个对象，判断是否过期，如果过期返回nil
//            //account.expiresDate和当前时间比较
//            
//            /*
//                    compare 返回值是 NSComparisonResul 类型
//                      OrderedAscending：升序，左边比又变小 <
//                      OrderedSame：相等 =
//                      OrderedDescending: 降序，左边比右边大 >
//
//            */
//            
//            //account.expiresDate >NSDate() 表示没有过期，降序
//            //测试过期时间
////            account.expiresDate = NSDate(timeIntervalSinceNow: -100)
//            print("account.expiresDate:\(account.expiresDate)")
//            print("NSDate():\(NSDate())")
//            
//            if account.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending{
//                print("没有过期")
//                return account
//            }
//        }
        
        //1,判断内存中的账户是否可用？
        if userAccount == nil {
            //内存中没有只能账户,就到沙盒中加载一个账户(有可能加载出来,也有肯那个加载不出),赋值给内存中的账户
           userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(plistPath) as? LyUserAccount
            print("从沙盒加载的账户：\(userAccount)")
        }else{
            print("从内存中获取已加载的账户")
        }
        
        //2,判断内存中是否有用账户，如果账户，判断时间是否过期
        if userAccount != nil && userAccount?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            //如果有账户并且没有过期,就是一个可用账户
            return userAccount
        }
        
        //如果过期就返回空
        return nil
    }
    
    ///解档
   required init?(coder aDecoder: NSCoder) {
        access_token = aDecoder.decodeObjectForKey("access_token") as? String
    expires_in = aDecoder.decodeDoubleForKey("expires_in")
    expiresDate = aDecoder.decodeObjectForKey("expiresDate") as? NSDate
    uid = aDecoder.decodeObjectForKey("uid") as? String
    
    }
    
    ///归档
    func encodeWithCoder(aCoder: NSCoder) {
        
        aCoder.encodeObject(access_token, forKey: "access_token")
        aCoder.encodeDouble(expires_in, forKey: "expires_in")
        aCoder.encodeObject(expiresDate,forKey: "expiresDate")
        aCoder.encodeObject(uid, forKey: "uid")
    }
    
    // 当KVC字典的key在模型中找不到对应的属性
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    /// 打印对象信息
    override var description: String {
            return "access_token:\(access_token), expires_in:\(expires_in), uid = \(uid), expiresDate:\(expiresDate)"
    }
//        print("forUndefinedKey key:\(key)")
}
